home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / basic / sorts.bas < prev    next >
Encoding:
BASIC Source File  |  1992-06-17  |  19.5 KB  |  445 lines

  1. 10 COLOR 14, 1: CLS : 'Filename: sorts.bas. 1992. Earle Arnow
  2. 15 GOSUB 6000
  3. 20 CLS : CLEAR : RANDOMIZE TIMER
  4. 30 LOCATE 9, 11: PRINT "MENU 2": PRINT TAB(9); STRING$(62, "-")
  5. 40 PRINT TAB(10); "1. Bubblesort"; TAB(36); "2. Endsort"
  6. 50 PRINT TAB(10); "3. Quicksort"; TAB(36); "4. Stripped Quicksort"
  7. 60 PRINT TAB(10); "5. Jumpsort"; TAB(36); "6. Flipsort"
  8. 70 PRINT TAB(10); "7. Fastsort"; TAB(36); "8. Insertion Sort"
  9. 80 PRINT TAB(10); "9. Shell-Metzner Sort"; TAB(35); "10. Smsort (Rewritten Shell-Metzner)"
  10. 90 PRINT TAB(9); "11. Run all sorts"; TAB(35); "12. Return to Menu 1"
  11. 100 PRINT
  12. 110 LOCATE 19, 10: INPUT "<ENTER> a number ===> ", NN
  13. 120 IF NN < 1 OR NN > 12 THEN LOCATE 19, 10: PRINT STRING$(30, " "): GOTO 110
  14. 125 IF NN = 12 THEN 700
  15. 130 CLS : LOCATE 9, 21: INPUT "Length of the array ", N
  16. 140 DIM A(N), A1(N), A2(N), S(50), A$(N), A1$(N), A2$(N)
  17. 145 IF S = 1 THEN 8000
  18. 150 CLS : PRINT "Unsorted array:": FOR Y = 1 TO N: R = INT(RND * N): A(Y) = R: PRINT A(Y); : A1(Y) = R: NEXT Y: PRINT ""
  19. 160 ON NN GOTO 200, 240, 270, 300, 330, 360, 390, 420, 450, 480, 600
  20. 200 T1 = TIMER: GOSUB 1000: T2 = TIMER: SEC1 = T2 - T1: PRINT "Bubblesort:": GOSUB 900
  21. 210 IF ZZ THEN GOSUB 920: GOTO 240
  22. 220 PRINT : PRINT TAB(20); "Bubblesort:"; SEC1; "seconds": GOTO 940
  23. 240 T1 = TIMER: GOSUB 1500: T2 = TIMER: SEC2 = T2 - T1: PRINT "Endsort:": GOSUB 900
  24. 250 IF ZZ THEN GOSUB 920: GOTO 270
  25. 260 PRINT : PRINT TAB(20); "Endsort:"; SEC2; "seconds": GOTO 940
  26. 270 T1 = TIMER: GOSUB 2000: T2 = TIMER: SEC3 = T2 - T1: PRINT "Quicksort:": GOSUB 900
  27. 280 IF ZZ THEN GOSUB 920: GOTO 300
  28. 290 PRINT : PRINT TAB(20); "Quicksort:"; SEC3; "seconds": GOTO 940
  29. 300 T1 = TIMER: GOSUB 2500: T2 = TIMER: SEC4 = T2 - T1: PRINT "Stripped quicksort:": GOSUB 900
  30. 310 IF ZZ THEN GOSUB 920: GOTO 330
  31. 320 PRINT : PRINT TAB(20); "Stripped quicksort:"; SEC4; "seconds": GOTO 940
  32. 330 T1 = TIMER: GOSUB 3000: T2 = TIMER: SEC5 = T2 - T1: PRINT "Jumpsort:": GOSUB 900
  33. 340 IF ZZ THEN GOSUB 920: GOTO 360
  34. 350 PRINT : PRINT TAB(20); "Jumpsort:"; SEC5; "seconds": GOTO 940
  35. 360 T1 = TIMER: GOSUB 3500: T2 = TIMER: SEC6 = T2 - T1: PRINT "Flipsort:": GOSUB 900
  36. 370 IF ZZ THEN GOSUB 920: GOTO 390
  37. 380 PRINT : PRINT TAB(20); "Flipsort:"; SEC6; "seconds": GOTO 940
  38. 390 T1 = TIMER: GOSUB 4000: T2 = TIMER: SEC7 = T2 - T1: PRINT "Fastsort:": GOSUB 900
  39. 400 IF ZZ THEN GOSUB 920: GOTO 420
  40. 410 PRINT : PRINT TAB(20); "Fastsort:"; SEC7; "seconds": GOTO 940
  41. 420 T1 = TIMER: GOSUB 4500: T2 = TIMER: SEC8 = T2 - T1: PRINT "Insertion sort:": GOSUB 900
  42. 430 IF ZZ THEN GOSUB 920: GOTO 450
  43. 440 PRINT : PRINT TAB(20); "Insertion sort:"; SEC8; "seconds": GOTO 940
  44. 450 T1 = TIMER: GOSUB 5000: T2 = TIMER: SEC9 = T2 - T1: PRINT "Shell-Metzner sort:": GOSUB 900
  45. 460 IF ZZ THEN GOSUB 920: GOTO 480
  46. 470 PRINT : PRINT TAB(20); "Shell-Metzner sort:"; SEC9; "seconds": GOTO 940
  47. 480 T1 = TIMER: GOSUB 5500: T2 = TIMER: SEC10 = T2 - T1: PRINT "smsort (rewritten Shell-Metzner):": GOSUB 900
  48. 490 IF ZZ THEN GOSUB 920: GOTO 510
  49. 500 PRINT : PRINT TAB(20); "Smsort (rewritten Shell-Metzner):"; SEC10; "seconds": GOTO 940
  50. 510 PRINT : PRINT "Bubblesort:"; SEC1; "seconds"; TAB(40); "Endsort:"; SEC2; "seconds"
  51. 520 PRINT "Quicksort:"; SEC3; "seconds"; TAB(40); "Stripped quicksort:"; SEC4; "seconds"
  52. 540 PRINT "Jumpsort:"; SEC5; "seconds"; TAB(40); "Flipsort:"; SEC6; "seconds"
  53. 550 PRINT "Fastsort:"; SEC7; "seconds"; TAB(40); "Insertion sort:"; SEC8; "seconds"
  54. 560 PRINT "Shell-Metzner sort:"; SEC9; "seconds"; TAB(40); "Smsort:"; SEC10; "seconds"
  55. 570 GOTO 940
  56. 600 ZZ = 1: GOTO 200
  57. 700 GOTO 10
  58. 890 '*** print sorted array
  59. 900 FOR Y = 1 TO N: PRINT A(Y); : NEXT Y: PRINT ""
  60. 910 RETURN
  61. 915 '*** Restore unsorted array
  62. 920 FOR Y = 1 TO N: A(Y) = A1(Y): NEXT Y: RETURN
  63. 940 PRINT : PRINT TAB(20); "Press any key to return to the MENU"
  64. 950 I$ = INPUT$(1): RUN
  65. 990 '*** Bubblesort
  66. 1000 F = 0
  67. 1010 FOR Y = 1 TO N - 1
  68. 1020 IF A(Y) > A(Y + 1) THEN SWAP A(Y), A(Y + 1): F = 1
  69. 1030 NEXT Y
  70. 1040 IF F = 0 THEN RETURN ELSE F = 0: GOTO 1010
  71. 1490 '*** endsort
  72. 1500 EN = N + 1
  73. 1510 EN = EN - 1
  74. 1520 IF EN = 1 THEN RETURN
  75. 1530 FOR Y = 1 TO EN - 1
  76. 1540 IF A(Y) > A(EN) THEN SWAP A(Y), A(EN)
  77. 1550 NEXT Y
  78. 1560 GOTO 1510
  79. 1990 '*** quicksort
  80. 2000 K8 = 0: I8 = 0
  81. 2010 S(I8 + 1) = 1: S(I8 + 2) = N
  82. 2020 K8 = K8 + 1
  83. 2030 IF K8 = 0 THEN RETURN
  84. 2040 K8 = K8 - 1: I8 = K8 + K8
  85. 2050 A8 = S(I8 + 1): B8 = S(I8 + 2)
  86. 2060 Z8 = A(A8): U8 = A8: L8 = B8 + 1
  87. 2070 L8 = L8 - 1
  88. 2080 IF L8 = U8 THEN 2130
  89. 2090 IF Z8 <= A(L8) THEN 2070 ELSE A(U8) = A(L8)
  90. 2100 U8 = U8 + 1
  91. 2110 IF L8 = U8 THEN 2130
  92. 2120 IF Z8 >= A(U8) THEN 2100 ELSE A(L8) = A(U8): GOTO 2070
  93. 2130 A(U8) = Z8
  94. 2140 IF B8 - U8 >= 2 THEN I8 = K8 + K8: S(I8 + 1) = U8 + 1: S(I8 + 2) = B8: K8 = K8 + 1
  95. 2150 IF L8 - A8 >= 2 THEN I8 = K8 + K8: S(I8 + 1) = A8: S(I8 + 2) = L8 - 1: K8 = K8 + 1
  96. 2160 GOTO 2030
  97. 2490 '*** stripped quicksort
  98. 2500 K8 = 0
  99. 2510 S1(K8) = 1: S2(K8) = N
  100. 2520 K8 = K8 + 1
  101. 2530 IF K8 = 0 THEN RETURN
  102. 2540 K8 = K8 - 1
  103. 2550 A8 = S1(K8): B8 = S2(K8)
  104. 2560 Z8 = A(A8): U8 = A8: L8 = B8 + 1
  105. 2570 L8 = L8 - 1
  106. 2580 IF L8 = U8 THEN 2630
  107. 2590 IF Z8 <= A(L8) THEN 2570 ELSE A(U8) = A(L8)
  108. 2600 U8 = U8 + 1
  109. 2610 IF L8 = U8 THEN 2630
  110. 2620 IF Z8 >= A(U8) THEN 2600 ELSE A(L8) = A(U8): GOTO 2570
  111. 2630 A(U8) = Z8
  112. 2640 IF B8 - U8 >= 2 THEN S1(K8) = U8 + 1: S2(K8) = B8: K8 = K8 + 1
  113. 2650 IF L8 - A8 >= 2 THEN S1(K8) = A8: S2(K8) = L8 - 1: K8 = K8 + 1
  114. 2660 GOTO 2530
  115. 2990 '*** jumpsort
  116. 3000 K8 = 0
  117. 3010 S1(K8) = 1: S2(K8) = N
  118. 3020 K8 = K8 + 1
  119. 3030 IF K8 = 0 THEN RETURN
  120. 3040 K8 = K8 - 1
  121. 3050 A8 = S1(K8): B8 = S2(K8)
  122. 3060 Z8 = A(A8): U8 = A8: L8 = B8 + 1
  123. 3070 L8 = L8 - 1
  124. 3080 IF L8 = U8 THEN 3130
  125. 3090 IF Z8 <= A(L8) THEN 3070 ELSE SWAP A(U8), A(L8)
  126. 3100 U8 = U8 + 1
  127. 3110 IF L8 = U8 THEN 3130
  128. 3120 IF Z8 >= A(U8) THEN 3100 ELSE SWAP A(L8), A(U8): GOTO 3070
  129. 3130 IF B8 - U8 >= 2 THEN S1(K8) = U8 + 1: S2(K8) = B8: K8 = K8 + 1
  130. 3140 IF L8 - A8 >= 2 THEN S1(K8) = A8: S2(K8) = L8 - 1: K8 = K8 + 1
  131. 3150 GOTO 3030
  132. 3490 '*** flipsort
  133. 3500 C = 0
  134. 3510 B1(C) = 1: B2(C) = N
  135. 3520 C = 1
  136. 3530 IF C = 0 THEN RETURN
  137. 3540 C = C - 1: D = B1(C): E = B2(C)
  138. 3550 F = D - 1: G = E
  139. 3560 F = F + 1
  140. 3570 IF F = G THEN 3620
  141. 3580 IF A(F) > A(G) THEN SWAP A(F), A(G) ELSE 3560
  142. 3590 G = G - 1
  143. 3600 IF F = G THEN 3620
  144. 3610 IF A(G) < A(F) THEN SWAP A(G), A(F): GOTO 3560 ELSE 3590
  145. 3620 IF E - F >= 2 THEN B1(C) = F + 1: B2(C) = E: C = C + 1
  146. 3630 IF G - D >= 2 THEN B1(C) = D: B2(C) = G - 1: C = C + 1
  147. 3640 GOTO 3530
  148. 3990 '*** fastsort
  149. 4000 C = 0
  150. 4010 B1(C) = 1: B2(C) = N
  151. 4020  C = C + 1
  152. 4030 IF C = 0 THEN RETURN
  153. 4040 C = C - 1
  154. 4050 D = B1(C): E = B2(C)
  155. 4060 Z = A(D): F = D - 1: G = E + 1
  156. 4070 FOR Y = D TO E
  157. 4080 IF Z > A(Y) THEN F = F + 1: A(F) = A(Y)
  158. 4090 IF Z < A(Y) THEN G = G - 1: A2(G) = A(Y)
  159. 4100 NEXT Y
  160. 4110 FOR Y = G TO E: A(Y) = A2(Y): NEXT Y
  161. 4120  FOR Y = F + 1 TO G - 1: A(Y) = Z: NEXT Y
  162. 4130  IF F - D > 0 THEN B1(C) = D: B2(C) = F: C = C + 1
  163. 4140 IF E - G > 0 THEN B1(C) = G: B2(C) = E: C = C + 1
  164. 4150 GOTO 4030
  165. 4490 '*** insertion sort
  166. 4500 FOR Y = 1 TO N - 1
  167. 4510 IF A(Y) > A(Y + 1) THEN SWAP A(Y), A(Y + 1) ELSE 4550
  168. 4520 D = Y - 1: IF D < 1 THEN 4550
  169. 4530 IF A(D) > A(D + 1) THEN SWAP A(D), A(D + 1) ELSE 4550
  170. 4540 D = D - 1: IF D >= 1 THEN 4530
  171. 4550 NEXT Y
  172. 4560 RETURN
  173. 4990 '*** Shell-Metzner sort
  174. 5000 M = N
  175. 5010 M = INT(M / 2)
  176. 5020 IF M = 0 THEN RETURN
  177. 5030 K = N - M: J = 1
  178. 5040 I = J
  179. 5050 L = I + M
  180. 5060 IF A(I) <= A(L) THEN 5100
  181. 5070 SWAP A(I), A(L): I = I - M
  182. 5090 IF I >= 1 THEN 5050
  183. 5100 J = J + 1
  184. 5110 IF J <= K THEN 5040 ELSE 5010
  185. 5490 '*** smsort (rewritten Shell-Metzner)
  186. 5500 M = N
  187. 5510 M = INT(M / 2): K = N - M
  188. 5520 IF M = 0 THEN RETURN
  189. 5530 FOR Y = 1 TO K
  190. 5540 IF A(Y) > A(Y + M) THEN SWAP A(Y), A(Y + M) ELSE 5580
  191. 5550 D = Y - M: IF D < 1 THEN 5580
  192. 5560 IF A(D) > A(D + M) THEN SWAP A(D), A(D + M) ELSE 5580
  193. 5570 D = D - M: IF D >= 1 THEN 5560
  194. 5580 NEXT Y
  195. 5590 GOTO 5510
  196. 5900 '
  197. 5995 'Menu 1
  198. 5997 '
  199. 6000 LOCATE 8, 20: PRINT "MENU 1": LOCATE 10, 20: PRINT "1. Discussion of sort methods": LOCATE 11, 20: PRINT "2. Run the sort programs": LOCATE 12, 20: PRINT "3. Exit to DOS"
  200. 6020 IN$ = INKEY$: IF IN$ = "1" THEN 7000 ELSE IF IN$ = "2" THEN CLS : GOTO 6100 ELSE IF IN$ = "3" THEN COLOR 7, 0: CLS:SYSTEM ELSE 6020
  201. 6100 CLS : LOCATE 8, 20: PRINT "Type of array:"
  202. 6120 LOCATE 10, 20: PRINT "1. Numerical"
  203. 6140 LOCATE 11, 20: PRINT "2. String"
  204. 6160 LOCATE 13, 20: PRINT "<ENTER> 1 or 2"
  205. 6180 IN$ = INKEY$: IF IN$ = "1" THEN 30 ELSE IF IN$ = "2" THEN S = 1: GOTO 30 ELSE 6180
  206. 6985 '
  207. 6990 'Discussion
  208. 6995 '
  209. 7000 CLS : LOCATE 2, 1: PRINT "BRIEF DISCUSSION OF SORTING PROGRAMS": PRINT
  210. 7020 PRINT "The sort routines used in writing programs in BASIC can be grouped into three"
  211. 7040 PRINT "types. The first type involves comparing every member of an array with every"
  212. 7060 PRINT "other member, using a swap of positions in the array when this is indicated."
  213. 7080 PRINT "The prototype of this method is the familar bubblesort. A variation requiring"
  214. 7100 PRINT "fewer comparisons involves selecting the last (or first) member of the array."
  215. 7120 PRINT "The other members of the array are compared with it, swapping when indicated."
  216. 7140 PRINT "This sorts the last member and makes the unsorted array one member shorter each"
  217. 7160 PRINT "time the computer runs through the program. Endsort is an example. Any computer"
  218. 7180 PRINT "programmer can write other variations.": PRINT
  219. 7200 PRINT "Quicksort, taken from the literature, is an example of the next category of"
  220. 7220 PRINT "sort procedures. It involves either choosing or finding some value (the value"
  221. 7240 PRINT "of the first member of the array in quicksort) as a kind of "; CHR$(34); "fence."; CHR$(34); " The"
  222. 7260 PRINT "program then moves all array members with values higher than this fence to the"
  223. 7280 PRINT "right side of the array, and all lower values are moved to the left side.  The"
  224. 7300 PRINT "The fence value then is in its correctly sorted position and need not be"
  225. 7320 PRINT "considered further. The array members on the left side, and those on the right"
  226. 7340 PRINT "side, are treated as two separate arays. They then are subjected to the sorting"
  227. 7345 LOCATE 23, 20: COLOR 15, 1: PRINT "(More. Press any key.)": COLOR 14, 1
  228. 7350 IN$ = INPUT$(1)
  229. 7355 CLS
  230. 7360 PRINT "procedure just described and this process is continued until sorting is"
  231. 7380 PRINT "complete.": PRINT
  232. 7400 PRINT "I have devised three variations on this theme; I refer to them as jumpsort,"
  233. 7420 PRINT "flipsort, and fastsort. For long arrays these programs are much faster than"
  234. 7440 PRINT "are bubblesort and endsort.  It is interesting that removal of a few"
  235. 7460 PRINT "unnecessary simple calculations from the commonly written program for quicksort"
  236. 7480 PRINT "(stripped quicksort) usually makes this routine a little faster.": PRINT
  237. 7500 PRINT "The third group of sort routines is exemplified by the insertion sort, many"
  238. 7520 PRINT "variations of which can be written. This sort involves moving an unsorted"
  239. 7540 PRINT "member of an array down (or up) the array until it reaches its proper niche:"
  240. 7560 PRINT "until the array members lower have smaller values, and the array members higher"
  241. 7580 PRINT "have larger values, than that of the inserted member. This type of sort is most"
  242. 7600 PRINT "valuable when the problem is to insert and sort new members of an already"
  243. 7620 PRINT "sorted array. Under these circumstances, it is very fast.": PRINT
  244. 7640 PRINT "The insertion sort can be speeded up for unsorted arrays if the array is"
  245. 7660 PRINT "partially sorted in advance of the final sorting by insertion. The Shell-"
  246. 7680 PRINT "Metzner sort, taken from the literature, is an example of this. In this"
  247. 7700 PRINT "routine, when the variable M becomes 1 (see line 5010 of this program), the"
  248. 7705 LOCATE 23, 20: COLOR 15, 1: PRINT "(More. Press any key.)": COLOR 14, 1
  249. 7710 IN$ = INPUT$(1)
  250. 7712 CLS
  251. 7720 PRINT "program then becomes the classical insertion sort, ending when M=0 (see line"
  252. 7740 PRINT "5020). I found that the Shell-Metzner sort usually becomes faster if it is"
  253. 7760 PRINT "rewritten to yield the routine I call smsort.": PRINT
  254. 7780 PRINT "When you run this program for the first time, I suggest you choose 11 from"
  255. 7800 PRINT "Menu 2, using an array length of 100."
  256. 7820 PRINT : COLOR 15, 1: PRINT TAB(20); "(Press any key to return to Menu 1)": COLOR 14, 1
  257. 7840 IN$ = INPUT$(1)
  258. 7860 GOTO 10
  259. 8000 CLS
  260. 8020 FOR X = 1 TO N
  261. 8040 FOR Y = 1 TO 4
  262. 8060 R = INT(RND * 26): R$ = R$ + CHR$(R + 65)
  263. 8080 NEXT Y
  264. 8100 A$(X) = R$
  265. 8120 R$ = ""
  266. 8130 NEXT X
  267. 8150 CLS : PRINT "Unsorted array:": FOR Y = 1 TO N: PRINT A$(Y); " "; : A1$(Y) = A$(Y): NEXT Y: PRINT ""
  268. 8160 ON NN GOTO 8200, 8240, 8270, 8300, 8330, 8360, 8390, 8420, 8450, 8480, 8600
  269. 8200 T1 = TIMER: GOSUB 9000: T2 = TIMER: SEC1 = T2 - T1: PRINT "Bubblesort:": GOSUB 8900
  270. 8210 IF ZZ THEN GOSUB 8920: GOTO 8240
  271. 8220 PRINT : PRINT TAB(20); "Bubblesort:"; SEC1; "seconds": GOTO 8940
  272. 8240 T1 = TIMER: GOSUB 9500: T2 = TIMER: SEC2 = T2 - T1: PRINT "Endsort:": GOSUB 8900
  273. 8250 IF ZZ THEN GOSUB 8920: GOTO 8270
  274. 8260 PRINT : PRINT TAB(20); "Endsort:"; SEC2; "seconds": GOTO 8940
  275. 8270 T1 = TIMER: GOSUB 10000: T2 = TIMER: SEC3 = T2 - T1: PRINT "Quicksort:": GOSUB 8900
  276. 8280 IF ZZ THEN GOSUB 8920: GOTO 8300
  277. 8290 PRINT : PRINT TAB(20); "Quicksort:"; SEC3; "seconds": GOTO 8940
  278. 8300 T1 = TIMER: GOSUB 10500: T2 = TIMER: SEC4 = T2 - T1: PRINT "Stripped quicksort:": GOSUB 8900
  279. 8310 IF ZZ THEN GOSUB 8920: GOTO 8330
  280. 8320 PRINT : PRINT TAB(20); "Stripped quicksort:"; SEC4; "seconds": GOTO 8940
  281. 8330 T1 = TIMER: GOSUB 11000: T2 = TIMER: SEC5 = T2 - T1: PRINT "Jumpsort:": GOSUB 8900
  282. 8340 IF ZZ THEN GOSUB 8920: GOTO 8360
  283. 8350 PRINT : PRINT TAB(20); "Jumpsort:"; SEC5; "seconds": GOTO 8940
  284. 8360 T1 = TIMER: GOSUB 11500: T2 = TIMER: SEC6 = T2 - T1: PRINT "Flipsort:": GOSUB 8900
  285. 8370 IF ZZ THEN GOSUB 8920: GOTO 8390
  286. 8380 PRINT : PRINT TAB(20); "Flipsort:"; SEC6; "seconds": GOTO 8940
  287. 8390 T1 = TIMER: GOSUB 12000: T2 = TIMER: SEC7 = T2 - T1: PRINT "Fastsort:": GOSUB 8900
  288. 8400 IF ZZ THEN GOSUB 8920: GOTO 8420
  289. 8410 PRINT : PRINT TAB(20); "Fastsort:"; SEC7; "seconds": GOTO 8940
  290. 8420 T1 = TIMER: GOSUB 12500: T2 = TIMER: SEC8 = T2 - T1: PRINT "Insertion sort:": GOSUB 8900
  291. 8430 IF ZZ THEN GOSUB 8920: GOTO 8450
  292. 8440 PRINT : PRINT TAB(20); "Insertion sort:"; SEC8; "seconds": GOTO 8940
  293. 8450 T1 = TIMER: GOSUB 13000: T2 = TIMER: SEC9 = T2 - T1: PRINT "Shell-Metzner sort:": GOSUB 8900
  294. 8460 IF ZZ THEN GOSUB 8920: GOTO 8480
  295. 8470 PRINT : PRINT TAB(20); "Shell-Metzner sort:"; SEC9; "seconds": GOTO 8940
  296. 8480 T1 = TIMER: GOSUB 13500: T2 = TIMER: SEC10 = T2 - T1: PRINT "smsort (rewritten Shell-Metzner):": GOSUB 8900
  297. 8490 IF ZZ THEN GOSUB 8920: GOTO 8510
  298. 8500 PRINT : PRINT TAB(20); "Smsort (rewritten Shell-Metzner):"; SEC10; "seconds": GOTO 8940
  299. 8510 PRINT : PRINT "Bubblesort:"; SEC1; "seconds"; TAB(40); "Endsort:"; SEC2; "seconds"
  300. 8520 PRINT "Quicksort:"; SEC3; "seconds"; TAB(40); "Stripped quicksort:"; SEC4; "seconds"
  301. 8540 PRINT "Jumpsort:"; SEC5; "seconds"; TAB(40); "Flipsort:"; SEC6; "seconds"
  302. 8550 PRINT "Fastsort:"; SEC7; "seconds"; TAB(40); "Insertion sort:"; SEC8; "seconds"
  303. 8560 PRINT "Shell-Metzner sort:"; SEC9; "seconds"; TAB(40); "Smsort:"; SEC10; "seconds"
  304. 8570 GOTO 8940
  305. 8600 ZZ = 1: GOTO 8200
  306. 8700 GOTO 10
  307. 8890 '*** print sorted array
  308. 8900 FOR Y = 1 TO N: PRINT A$(Y); " "; : NEXT Y: PRINT
  309. 8910 RETURN
  310. 8915 '*** Restore unsorted array
  311. 8920 FOR Y = 1 TO N: A$(Y) = A1$(Y): NEXT Y: RETURN
  312. 8940 PRINT : PRINT TAB(20); "Press any key to return to the MENU"
  313. 8950 I$ = INPUT$(1): RUN
  314. 8990 '*** Bubblesort
  315. 9000 F = 0
  316. 9010 FOR Y = 1 TO N - 1
  317. 9020 IF A$(Y) > A$(Y + 1) THEN SWAP A$(Y), A$(Y + 1): F = 1
  318. 9030 NEXT Y
  319. 9040 IF F = 0 THEN RETURN ELSE F = 0: GOTO 9010
  320. 9490 '*** endsort
  321. 9500 EN = N + 1
  322. 9510 EN = EN - 1
  323. 9520 IF EN = 1 THEN RETURN
  324. 9530 FOR Y = 1 TO EN - 1
  325. 9540 IF A$(Y) > A$(EN) THEN SWAP A$(Y), A$(EN)
  326. 9550 NEXT Y
  327. 9560 GOTO 9510
  328. 9990 '*** quicksort
  329. 10000 K8 = 0: I8 = 0
  330. 10010 S(I8 + 1) = 1: S(I8 + 2) = N
  331. 10020 K8 = K8 + 1
  332. 10030 IF K8 = 0 THEN RETURN
  333. 10040 K8 = K8 - 1: I8 = K8 + K8
  334. 10050 A8 = S(I8 + 1): B8 = S(I8 + 2)
  335. 10060 Z8$ = A$(A8): U8 = A8: L8 = B8 + 1
  336. 10070 L8 = L8 - 1
  337. 10080 IF L8 = U8 THEN 10130
  338. 10090 IF Z8$ <= A$(L8) THEN 10070 ELSE A$(U8) = A$(L8)
  339. 10100 U8 = U8 + 1
  340. 10110 IF L8 = U8 THEN 10130
  341. 10120 IF Z8$ >= A$(U8) THEN 10100 ELSE A$(L8) = A$(U8): GOTO 10070
  342. 10130 A$(U8) = Z8$
  343. 10140 IF B8 - U8 >= 2 THEN I8 = K8 + K8: S(I8 + 1) = U8 + 1: S(I8 + 2) = B8: K8 = K8 + 1
  344. 10150 IF L8 - A8 >= 2 THEN I8 = K8 + K8: S(I8 + 1) = A8: S(I8 + 2) = L8 - 1: K8 = K8 + 1
  345. 10160 GOTO 10030
  346. 10490 '*** stripped quicksort
  347. 10500 K8 = 0
  348. 10510 S1(K8) = 1: S2(K8) = N
  349. 10520 K8 = K8 + 1
  350. 10530 IF K8 = 0 THEN RETURN
  351. 10540 K8 = K8 - 1
  352. 10550 A8 = S1(K8): B8 = S2(K8)
  353. 10560 Z8$ = A$(A8): U8 = A8: L8 = B8 + 1
  354. 10570 L8 = L8 - 1
  355. 10580 IF L8 = U8 THEN 10630
  356. 10590 IF Z8$ <= A$(L8) THEN 10570 ELSE A$(U8) = A$(L8)
  357. 10600 U8 = U8 + 1
  358. 10610 IF L8 = U8 THEN 10630
  359. 10620 IF Z8$ >= A$(U8) THEN 10600 ELSE A$(L8) = A$(U8): GOTO 10570
  360. 10630 A$(U8) = Z8$
  361. 10640 IF B8 - U8 >= 2 THEN S1(K8) = U8 + 1: S2(K8) = B8: K8 = K8 + 1
  362. 10650 IF L8 - A8 >= 2 THEN S1(K8) = A8: S2(K8) = L8 - 1: K8 = K8 + 1
  363. 10660 GOTO 10530
  364. 10990 '*** jumpsort
  365. 11000 K8 = 0
  366. 11010 S1(K8) = 1: S2(K8) = N
  367. 11020 K8 = K8 + 1
  368. 11030 IF K8 = 0 THEN RETURN
  369. 11040 K8 = K8 - 1
  370. 11050 A8 = S1(K8): B8 = S2(K8)
  371. 11060 Z8$ = A$(A8): U8 = A8: L8 = B8 + 1
  372. 11070 L8 = L8 - 1
  373. 11080 IF L8 = U8 THEN 11130
  374. 11090 IF Z8$ <= A$(L8) THEN 11070 ELSE SWAP A$(U8), A$(L8)
  375. 11100 U8 = U8 + 1
  376. 11110 IF L8 = U8 THEN 11130
  377. 11120 IF Z8$ >= A$(U8) THEN 11100 ELSE SWAP A$(L8), A$(U8): GOTO 11070
  378. 11130 IF B8 - U8 >= 2 THEN S1(K8) = U8 + 1: S2(K8) = B8: K8 = K8 + 1
  379. 11140 IF L8 - A8 >= 2 THEN S1(K8) = A8: S2(K8) = L8 - 1: K8 = K8 + 1
  380. 11150 GOTO 11030
  381. 11490 '*** flipsort
  382. 11500 C = 0
  383. 11510 B1(C) = 1: B2(C) = N
  384. 11520 C = 1
  385. 11530 IF C = 0 THEN RETURN
  386. 11540 C = C - 1: D = B1(C): E = B2(C)
  387. 11550 F = D - 1: G = E
  388. 11560 F = F + 1
  389. 11570 IF F = G THEN 11620
  390. 11580 IF A$(F) > A$(G) THEN SWAP A$(F), A$(G) ELSE 11560
  391. 11590 G = G - 1
  392. 11600 IF F = G THEN 11620
  393. 11610 IF A$(G) < A$(F) THEN SWAP A$(G), A$(F): GOTO 11560 ELSE 11590
  394. 11620 IF E - F >= 2 THEN B1(C) = F + 1: B2(C) = E: C = C + 1
  395. 11630 IF G - D >= 2 THEN B1(C) = D: B2(C) = G - 1: C = C + 1
  396. 11640 GOTO 11530
  397. 11990 '*** fastsort
  398. 12000 C = 0
  399. 12010 B1(C) = 1: B2(C) = N
  400. 12020  C = C + 1
  401. 12030 IF C = 0 THEN RETURN
  402. 12040 C = C - 1
  403. 12050 D = B1(C): E = B2(C)
  404. 12060 Z$ = A$(D): F = D - 1: G = E + 1
  405. 12070 FOR Y = D TO E
  406. 12080 IF Z$ > A$(Y) THEN F = F + 1: A$(F) = A$(Y)
  407. 12090 IF Z$ < A$(Y) THEN G = G - 1: A2$(G) = A$(Y)
  408. 12100 NEXT Y
  409. 12110 FOR Y = G TO E: A$(Y) = A2$(Y): NEXT Y
  410. 12120  FOR Y = F + 1 TO G - 1: A$(Y) = Z$: NEXT Y
  411. 12130  IF F - D > 0 THEN B1(C) = D: B2(C) = F: C = C + 1
  412. 12140 IF E - G > 0 THEN B1(C) = G: B2(C) = E: C = C + 1
  413. 12150 GOTO 12030
  414. 12490 '*** insertion sort
  415. 12500 FOR Y = 1 TO N - 1
  416. 12510 IF A$(Y) > A$(Y + 1) THEN SWAP A$(Y), A$(Y + 1) ELSE 12550
  417. 12520 D = Y - 1: IF D < 1 THEN 12550
  418. 12530 IF A$(D) > A$(D + 1) THEN SWAP A$(D), A$(D + 1) ELSE 12550
  419. 12540 D = D - 1: IF D >= 1 THEN 12530
  420. 12550 NEXT Y
  421. 12560 RETURN
  422. 12990 '*** Shell-Metzner sort
  423. 13000 M = N
  424. 13010 M = INT(M / 2)
  425. 13020 IF M = 0 THEN RETURN
  426. 13030 K = N - M: J = 1
  427. 13040 I = J
  428. 13050 L = I + M
  429. 13060 IF A$(I) <= A$(L) THEN 13100
  430. 13070 SWAP A$(I), A$(L): I = I - M
  431. 13090 IF I >= 1 THEN 13050
  432. 13100 J = J + 1
  433. 13110 IF J <= K THEN 13040 ELSE 13010
  434. 13490 '*** smsort (rewritten Shell-Metzner)
  435. 13500 M = N
  436. 13510 M = INT(M / 2): K = N - M
  437. 13520 IF M = 0 THEN RETURN
  438. 13530 FOR Y = 1 TO K
  439. 13540 IF A$(Y) > A$(Y + M) THEN SWAP A$(Y), A$(Y + M) ELSE 13580
  440. 13550 D = Y - M: IF D < 1 THEN 13580
  441. 13560 IF A$(D) > A$(D + M) THEN SWAP A$(D), A$(D + M) ELSE 13580
  442. 13570 D = D - M: IF D >= 1 THEN 13560
  443. 13580 NEXT Y
  444. 13590 GOTO 13510
  445.